package com.winning.bi.jdbc.dao;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

/**
 * 
 * 
 * 
 * @author 张大川 查询接口
 */
public interface Dao {

	/**
	 * 获取一个结果 使用 map 映射
	 * 
	 * @param sql
	 * @return
	 */
	Map<String, Object> getMap(String sql);

	List<Map<String, Object>> getListMap(String sql, Map<String, String> fieldName, Map<String, String> fitName);

	List<Map<String, Object>> getListMapByName(String tablename, String[] fitName, Object objects);

	List<Map<String, Object>> getListMapByName(String name, String[] fieldName, Object... objects);

	List<Map<String, Object>> getListMap(String sql, Object... objects);

	byte[] queryForObject(String sql);

	List<Map<String, Object>> taskInfo();

	/**
	 * 查询 任务信息
	 * 
	 * @return
	 * @throws Exception
	 */
	Page queryTaskInfo(Page objects) throws Exception;

	Page queryTaskLog(Page objects) throws Exception;

	/**
	 * 表的获取元数据
	 * 
	 * @param tableName
	 *            表名
	 * @return
	 */
	Map<String, String> getMetaData(String tableName);

	/**
	 * 
	 * @param tableName
	 * @return
	 */
	String[][] getMetaDataArray(String tableName);

	/**
	 * 获得表名
	 * 
	 * @param tableName
	 * @return
	 */
	String[] getMetDataStrings(String tableName);

	/**
	 * 向特定表插入一条记录
	 * 
	 * @param map
	 *            记录数据
	 * @param tableName
	 *            表名
	 * @throws SQLException
	 */
	void insertMap(Map<String, Object> map, String tableName) throws SQLException;

	/**
	 * 
	 * @param map
	 *            待插入数据
	 * @param tableName
	 *            表名
	 * @param strings
	 *            需插入的列名
	 * @throws SQLException 
	 */
	void insertMap(Map<String, Object> map, String tableName, String... strings) throws SQLException;

	/**
	 * 根据表名获取最大 rowversion
	 * 
	 * @param table
	 * @return
	 */
	byte[] getMaxVersion(String table);

	byte[] getMinVersion(String table);

	Long getCountNumber(String sql);

	/**
	 * 
	 * @param list
	 *            要插入的队列數據
	 * @param tableName
	 *            表名
	 * @param objects
	 *            要插入的列 ,有些列不能插入
	 */
	void insertList(List<Map<String, Object>> list, String tableName, String... objects);

	void insetSql(String sql, Object[] objects);

	int deleteTask(String taskId);

	/**
	 * 
	 * 获取元数据
	 * 
	 * @param source
	 * @return
	 * @throws SQLException
	 */
	DatabaseMetaData getDataBaseMetaData(DataSource source) throws SQLException;

	/**
	 * 根据数据源和概要获取表名和表注释
	 * 
	 * @param dataSource
	 * @param schemaName
	 * @return
	 * @throws SQLException
	 */
	String[][] getTableNames(DataSource dataSource, String schemaName) throws SQLException;

	int updatetaskInfo(String sql, Object... objects);

}
